1. Field of the Invention
This invention relates in general to computer operating systems, and more particularly to a method, apparatus and program storage device for providing an anchor pointer in an operating system context structure for improving the efficiency of accessing thread specific data.
2. Description of Related Art
In any operating system that supports protection and security, protection boundaries separate user processes from each other, and from the operating system (OS) kernel. Generally, there are two protection domains in the operating system: the user protection domain and the kernel mode protection domain. Application programs run in the user protection domain. The user protection domain provides read and write access to the data region of the process, read access to the text and shared text regions of the process and access to shared data regions using the shared memory functions. When a program is running in the user protection domain, the processor executes instructions in the problem state, and the program does not have direct access to kernel data.
The code in the kernel and kernel extensions run in the kernel protection domain. This code includes interrupt handlers, kernel processes, device drivers, system calls, and file system code. The processor is in the kernel protection domain when it executes instructions in the privileged state. The privileged state provides read and write access to the global kernel address space and read and write access to the thread, except when an interrupt handler is running.
Code running in the kernel protection domain can affect the execution environments of all processes. Code running in the kernel protection domain can access global system data, can use all kernel services and is exempt from all security constraints. Thus, programming errors in the code running in the kernel protection domain can cause the operating system to fail. In particular, a process's user data cannot be accessed directly, but must normally be accessed using the kernel services, or their variants. These routines protect the kernel from improperly supplied user data addresses. Application programs can gain controlled access to kernel data by making system calls. The use of a system call by a user-mode process allows a kernel function to be called from the user mode. Access to functions that directly or indirectly invoke system calls is typically provided by programming libraries, providing access to operating system functions.
A user process includes a set of system resources for executing one or more “threads”. A thread is a simple execution path through application software and the operating system. Stated differently, a thread is a separate sequential flow of control that takes place during the execution of a data processing program or application. A thread may also be described as the active execution of a designated data processing routine, including any nested routine invocations. Kernels or kernel threads are control flows that enable concurrent processing of a procedure by a plurality of processors thereby dividing a task to be performed into parts and decreasing the task execution time. Multi-threading can be used in single processor systems to perform several tasks at the same time such as input monitoring and computation execution. Multi-threading can also be used in multi-processor systems to perform several control flows or threads in parallel.
For a multithreaded application, it is very common to have identical code running on multiple threads. Part of the process of multithreaded application design is to determine where data access conflicts between multiple threads can potentially lead to data corruption and how to avoid such conflicts. Most solutions to multithreading problems deal with synchronization concepts, such as how to serialize threads that share common data. This focus on synchronization occurs because synchronization is an indispensable part of multithreaded programming. Moreover, each thread might still need to access and maintain data that is specific to that particular thread. For example, a thread's current state, which is represented by a current program counter, a call/return stack, the processor's registers, and some thread-specific data, allows the processor to freeze a thread (i.e., stop executing it) and to continue execution at a later time from the point where the thread was stopped.
All threads within a process share system resources and operate in the same address space. Static variables declared within a computer program have a static storage location. Accordingly, references to a static variable from any thread will refer to the memory location allocated to that variable. Multiple copies of static variables location are not created as they may be with other variables types. The value of a static variable will always be the last value written to its memory. One of the primary advantages of static variables is that their values persist between references, and will exist for as long as the program operates. In a multi-threaded program, static variables allow a thread to resume execution of its instructions and access data it was using before it relinquished control of the CPU to another thread.
One of the primary difficulties that result from using static variables in multi-threaded computer programs is that changes to a static variable made by one thread will be seen by all other threads operating within the same process. Multiple threads cannot use static variables separately because other threads within the process can overwrite the values stored at the variable memory location. Thus, the development of multi-threaded programs using static variables often requires explicit thread harmonization by the programmer. Another problem is that threads within the same process must use unique static variable IDs to avoid reading or writing to the location of another static variable. This also requires thread harmonization by the programmer. Since, identical code is running on each thread of a multithreaded process, remapping of some thread specific data, e.g., thread ID, etc., from the operating system to the address of a thread specific save area is typically required. However, this is inefficient because system resources are tied-up during the remapping process.
It can be seen then that there is a need for a method, apparatus and program storage device for providing an anchor pointer in an operating system context structure for improving the efficiency of accessing thread specific data.